import time
import thread
import socket
import string
from threading import Thread

def menu():
   print 'CLIENTE P2P'
   buscar = raw_input("Buscar: ")
   while buscar != "-no":
      broadcast(buscar)
      time.sleep(10)
      bajar = raw_input("Desea bajar algun archivo? (Para confirmar digite -si) ")
      if bajar == "-si":
         download = raw_input("Datos del Archivo a Bajar (Servidor, Archivo, Nuevo nombre de Archivo, Contrasena) ")
         lista = string.split(download, ",")
         par = 1
         server = ""
         archivo = ""
         nuevo = ""
         passw = ""
         for dato in lista:
            if par == 1:
               server = dato.strip()
               par = par + 1
            else:
               if par == 2:
                  archivo = dato.strip()
                  par = par + 1
               else:
                  if par == 3:
                     nuevo = dato.strip()
                     par = par + 1
                  else:
                     passw = dato.strip()
         if (server == "" or archivo == "" or nuevo == ""):
            print "Datos Incompletos"
         else:
            tcpclient(server, archivo, nuevo, passw)
      buscar = raw_input("Buscar: ")

def udpserver(puerto):
   miSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
   miSocket.bind((socket.gethostname(), puerto))
   recibido = ""
   while True:
      data, client = miSocket.recvfrom(1024)
      lista = string.split(data, ";")
      encontrado = ""
      if lista[0] == "R":
         encontrado = buscador(lista[1])
         miSocket.sendto(encontrado, (client[0], puerto))
      else:
         if data != "":
            print client[0]
            recibido = string.split(data, ":")
            for rec in recibido:
               print rec
            print ""

def tcpserver(puerto):
   miSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   miSocket.bind((socket.gethostname(), puerto))
   miSocket.listen(1)
   while True:
      channel, details = miSocket.accept()
      data = channel.recv(256)
      lista = string.split(data, ",")
      encontrado = buscaruno(lista[0].strip())
      encontrado = encontrado.strip()
      listae = string.split(encontrado, ",")
      passw = password()
      if lista[1] == passw or listae[1] == "L":
         archivo = open(listae[0], 'rb')
         enviar = archivo.read(1024)
         while (enviar != ""):
            channel.send(enviar)
            enviar = archivo.read(1024)
      else:
         enviar = "999 Contrasena erronea. Archivo no enviado"
         channel.send(enviar)
      channel.close()

def tcpclient(server, archivo, nuevo, passw):
   archivo = archivo + "," + passw
   puerto = 18000;
   miSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   miSocket.connect((server, puerto))
   miSocket.send(archivo)
   data, server = miSocket.recvfrom(1024)
   if data == "999 Contrasena erronea. Archivo no enviado":
      print "La Contrasena es erronea. El archivo no se recibio"
      print ""
   else:
      nuevoarchivo = open(nuevo, "wb")
      while(data != ""):
         nuevoarchivo.write(data)
         data, server = miSocket.recvfrom(1024)
      nuevoarchivo.close()
      print "El archivo ", nuevo, " ha sido correctamente recibido\n"
   miSocket.close()

def broadcast(texto):
   texto = "R;" + texto
   puerto = 17000;
   miSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
   miSocket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
   miSocket.sendto(texto, ('255.255.255.255', puerto))
   miSocket.close()

def buscador(buscar):
   buscar = buscar.lower()
   archivo = open("compartido.txt", "r")
   linea = archivo.readline()
   resultado = ""
   ban = 0
   while linea != "":
      linealc = linea.lower()
      if linealc.find(buscar) >= 0:
         if ban == 0:
            resultado = linea.strip()
            ban = 1
         else:
            resultado = resultado + ":" + linea.strip()
      linea = archivo.readline()
   archivo.close()
   return resultado

def buscaruno(buscar):
   buscar = buscar.lower()
   archivo = open("compartido.txt", "r")
   linea = archivo.readline()
   while linea != "":
      linealc = linea.lower()
      if linealc.find(buscar) >= 0:
         archivo.close()
         return linea
      linea = archivo.readline()
   archivo.close()
   return ""

def password():
   archivo = open("C:\password.txt", "r")
   linea = archivo.readline()
   archivo.close()
   return linea

if __name__=="__main__":
   try:
      Thread(target=udpserver, args=(170000,)).start()
      Thread(target=tcpserver, args=(180000,)).start()
      Thread(target=menu, args=()).start()
   except Exception, errtxt:   
      print errtxt
